package com.itheima.sh.dao;

import com.itheima.sh.pojo.Order;
import com.itheima.sh.pojo.User;
import com.itheima.sh.util.ProviderUtils;
import org.apache.ibatis.annotations.*;

import java.util.List;

public interface UserMapper {
   /*
        使用注解实现增删改查
        1.查询：@Select
        2.插入：@Insert
        3.更新：@Update
        4.删除：@Delete
    */
   //1.查询：@Select select * from tb_user where id=1;
    @Select("select * from tb_user where id=#{id}")
    User queryUserById(@Param("id")Long id);
    //2.插入：@Insert
    @Insert("insert into tb_user values(null,#{userName},#{password},#{name},#{age},#{sex})")
    void addUser(User user);
    //3.更新：@Update
    @Update("update tb_user set user_name=#{userName},password=#{password},name=#{name},age=#{age},sex=#{sex} where id=#{id}")
    void updateUser(User user);
    // 4.删除：@Delete
    @Delete("delete from tb_user where id=#{id}")
    void deleteUserById(@Param("id")Long id);


    /*
      动态sql
      【需求】：查询**男性**用户，**如果输入了用户名，按用户名模糊查询**,如果**没有输入用户名，就查询所有男性用户**。
     */
    /*@Select("<script>select * from tb_user where sex=1\n" +
            "        <if test=\"userName!=null and userName.trim()!=''\">\n" +
            "            and user_name like concat('%',#{userName},'%')\n" +
            "        </if></script>")*/
    /*
       1.type = ProviderUtils.class 表示提供一个产生动态sql的工具类
       2. method = "queryUserBySexOrUsernameSQL" 表示产生动态sql的方法，该方法要求：
         1）必须有返回值是String类型，返回动态的sql语句
         2）该方法的参数列表必须和接口大的方法一致，并且使用命名参数
     */
    @SelectProvider(type = ProviderUtils.class, method = "queryUserBySexOrUsernameSQL")
    List<User> queryUserBySexOrUsername(@Param("userName")String userName);


    /*
     注解方式实现一对多查询
     	说明：查询id是1的用户，一个用户可以有多个订单。所以用户和订单是一对多关系。
     */
    @Select("select * from tb_user where id = #{id}")
    @Results(value = {
            //声明tb_user表示和实体类User的主键关系
            @Result(id=true,column = "id",property = "id"),
            /*
              1.property = "orders" : 表示实体类User的成员变量名 List<Order> orders;
              2.column = "id":表示上述sql语句 select * from tb_user where id = #{id} 查询的用户id作为下面sql语句
              select * from tb_order where user_id=1;的入参
              3.many = @Many(select = "com.itheima.sh.dao.OrderMapper.queryOrdersByUserId")
              根据接口名.方法名找到另外一条sql语句
             */
            @Result(column = "id",property = "orders",
                    javaType = List.class,many = @Many(select = "com.itheima.sh.dao.OrderMapper.queryOrdersByUserId"))
    })
    User queryUserById2(@Param("id")Long id);
}
